package com.jiangyu.template2;

/**
 * 模版方法设计模式：
 *
 * 准备一个抽象类，在一个模板方法中定义一个算法的骨架，而将一些步骤实现延迟到子类中。
 * 模板方法使得子类可以在不改变算法结构的情况下，重新定义算法中的某些步骤。
 * 将主要的方法定义为final，防止子类修改算法骨架，将子类必须实现的方法定义为abstract。
 * 而普通的方法（无final或abstract修饰）则称之为钩子方法。
 *
 * 钩子方法作用：
 * 1)作为可选内容，子类可以重写或者置之不理
 * 2)让子类有机会对模板方法中即将发生的或者已经发生的步骤做出反应
 * 3)作为控制条件，使得子类可以影响到抽象类中的算法流程
 * 模板方法模式是所有模式中最为常见的几个模式之一，是基于继承的代码复用的基本技术。
 *
 * 优点：
 * 1)模板方法模式在一个类中形式化地定义算法，而由它的子类实现细节的处理。
 * 2)模板方法是一种代码复用的基本技术。它提取了类库中的公共行为。
 * 3)模板方法模式导致一种反向的控制结构，这种结构有时被称为“好莱坞法则”，即“别找我们，,
 * 我们找你”通过一个父类调用其子类的操作(而不是相反的子类调用父类)，通过对子类的扩展增加新的行为，符合“开闭原则”。
 *
 * 缺点：
 * 每个不同的实现都需要定义一个子类，这会导致类的个数增加，系统更加庞大，设计也更加抽象，
 * 但是更加符合“单一职责原则”，使得类的内聚性得以提高。
 *
 *
 */
public class Client {

    public static void main(String[] args) {
        System.out.println("-----泡茶---------");
        Tea tea = new Tea();
        tea.make();

        System.out.println("------冲咖啡--------");
        Coffee coffee = new Coffee();
        coffee.make();

    }

}

